home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / gcctest / tests05.zoo / tstrl1.c < prev    next >
C/C++ Source or Header  |  1992-03-28  |  3KB  |  127 lines

  1. /* My bet is this was written by Chris Torek.
  2.    I reformatted and ansidecl-ized it, and tweaked it a little.  */
  3.  
  4. #include "ansidecl.h"
  5. #include <ctype.h>
  6. #include <stdio.h>
  7. #include <errno.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. struct ltest
  12.   {
  13.     CONST char *str;        /* Convert this.  */
  14.     unsigned long int expect;    /* To get this.  */
  15.     int base;            /* Use this base.  */
  16.     char left;            /* With this left over.  */
  17.     int err;            /* And this in errno.  */
  18.   };
  19. static CONST struct ltest tests[] =
  20.   {
  21.     /* First, signed numbers.  */
  22.     "   -17",        -17,        0,    0,    0,
  23.     " +0x123fg",    0x123f,        0,    'g',    0,
  24.     "2147483647",    2147483647,    0,    0,    0,
  25.     "2147483648",    2147483647,    0,    0,    ERANGE,
  26.     "214748364888",    2147483647,    0,    0,    ERANGE,
  27.     "2147483650",    2147483647,    0,    0,    ERANGE,
  28.     "-2147486349",    -2147483648,    0,    0,    ERANGE,
  29.     "-2147483648",    -2147483648,    0,    0,    0,
  30.     "0123",        0123,        0,    0,    0,
  31.     "0x1122334455z",    2147483647,    16,    'z',    ERANGE,
  32.     "0x0xc",        0,        0,    'x',    0,
  33.     "yz!",        34*36+35,    36,    '!',    0,
  34.     NULL,        0,        0,    0,    0,
  35.  
  36.     /* Then unsigned.  */
  37.     "  0",        0,        0,    0,    0,
  38.     "0xffffffffg",    0xffffffff,    0,    'g',    0,
  39.     "0xf1f2f3f4f5",    0xffffffff,    0,    0,    ERANGE,
  40.     "-0x123456789",    0xffffffff,    0,    0,    ERANGE,
  41.     "-0xfedcba98",    -0xfedcba98,    0,    0,    0,
  42.     NULL,        0,        0,    0,    0,
  43.   };
  44.  
  45. static void EXFUN(expand, (char *dst, int c));
  46.  
  47. int
  48. DEFUN_VOID(main)
  49. {
  50.   register CONST struct ltest *lt;
  51.   char *ep;
  52.   int status = 0;
  53.  
  54.   for (lt = tests; lt->str != NULL; ++lt)
  55.     {
  56.       register long int l;
  57.  
  58.       errno = 0;
  59.       l = strtol(lt->str, &ep, lt->base);
  60.       if (l == (long int) lt->expect && *ep == lt->left && errno == lt->err)
  61.     /* puts("\tOK") */;
  62.       else
  63.     {
  64.       printf("strtol(\"%s\", , %d) test %u",
  65.          lt->str, lt->base, (unsigned int) (lt - tests));
  66.       puts("\tBAD");
  67.       if (l != (long int) lt->expect)
  68.         printf("  returns %ld, expected %ld\n",
  69.            l, (long int) lt->expect);
  70.       if (lt->left != *ep)
  71.         {
  72.           char exp1[5], exp2[5];
  73.           expand(exp1, *ep);
  74.           expand(exp2, lt->left);
  75.           printf("  leaves '%s', expected '%s'\n", exp1, exp2);
  76.         }
  77.       if (errno != lt->err)
  78.         printf("  errno %d (%s)  instead of %d (%s)\n",
  79.            errno, strerror(errno), lt->err, strerror(lt->err));
  80.       status = 1;
  81.     }
  82.     }
  83.  
  84.   for (++lt; lt->str != NULL; lt++)
  85.     {
  86.       register unsigned long int ul;
  87.  
  88.       errno = 0;
  89.       ul = strtoul(lt->str, &ep, lt->base);
  90.       if (ul == lt->expect && *ep == lt->left && errno == lt->err)
  91.     /* puts("\tOK") */;
  92.       else
  93.     {
  94.           printf("strtoul(\"%s\", , %d) test %u",
  95.          lt->str, lt->base, (unsigned int) (lt - tests));
  96.       puts("\tBAD");
  97.       if (ul != lt->expect)
  98.         printf("  returns %lu, expected %lu\n",
  99.            ul, lt->expect);
  100.       if (lt->left != *ep)
  101.         {
  102.           char exp1[5], exp2[5];
  103.           expand(exp1, *ep);
  104.           expand(exp2, lt->left);
  105.           printf("  leaves '%s', expected '%s'\n", exp1, exp2);
  106.         }
  107.       if (errno != lt->err)
  108.         printf("  errno %d (%s) instead of %d (%s)\n",
  109.            errno, strerror(errno), lt->err, strerror(lt->err));
  110.       status = 1;
  111.     }
  112.     }
  113.  
  114.  return (status ? EXIT_FAILURE : EXIT_SUCCESS);
  115. }
  116. static void
  117. DEFUN(expand, (dst, c), register char *dst AND register int c)
  118. {
  119.   if (isprint(c))
  120.     {
  121.       dst[0] = c;
  122.       dst[1] = '\0';
  123.     }
  124.   else
  125.     (void) sprintf(dst, "%#.3o", (unsigned int) c);
  126. }
  127.